/**
 * 权限管理工具函数
 */

// 权限定义
export const PERMISSIONS = {
  BASIC: 'basic',
  USER_MANAGEMENT: 'user_management',
  AUDIT_MANAGEMENT: 'audit_management',
  DATA_MANAGEMENT: 'data_management',
  SERVICE_MANAGEMENT: 'service_management',
  ORDER_MANAGEMENT: 'order_management',
  NOTIFICATION_MANAGEMENT: 'notification_management',
  ADMIN: 'admin',
  SUPER_ADMIN: 'super_admin'
}

// 权限名称映射
export const PERMISSION_NAMES = {
  [PERMISSIONS.BASIC]: '基础权限',
  [PERMISSIONS.USER_MANAGEMENT]: '用户管理',
  [PERMISSIONS.AUDIT_MANAGEMENT]: '审核管理',
  [PERMISSIONS.DATA_MANAGEMENT]: '数据管理',
  [PERMISSIONS.SERVICE_MANAGEMENT]: '服务管理',
  [PERMISSIONS.ORDER_MANAGEMENT]: '订单管理',
  [PERMISSIONS.NOTIFICATION_MANAGEMENT]: '通知管理',
  [PERMISSIONS.ADMIN]: '管理员权限',
  [PERMISSIONS.SUPER_ADMIN]: '超级管理员'
}

// 角色定义
export const ROLES = {
  SUPER_ADMIN: 'super_admin',
  ADMIN: 'admin',
  MANAGER: 'manager',
  AUDITOR: 'auditor',
  SERVICE_ADMIN: 'service_admin',
  USER: 'user',
  CUSTOM: 'custom'
}

// 角色名称映射
export const ROLE_NAMES = {
  [ROLES.SUPER_ADMIN]: '超级管理员',
  [ROLES.ADMIN]: '管理员',
  [ROLES.MANAGER]: '业务经理',
  [ROLES.AUDITOR]: '审核员',
  [ROLES.SERVICE_ADMIN]: '服务管理员',
  [ROLES.USER]: '普通用户',
  [ROLES.CUSTOM]: '自定义权限'
}

/**
 * 检查用户是否有指定权限
 * @param {string} permission 权限标识
 * @param {string} targetOpenid 目标用户openid（可选）
 * @returns {Promise<boolean>} 是否有权限
 */
export async function checkPermission(permission, targetOpenid = null) {
  try {
    const result = await wx.cloud.callFunction({
      name: 'checkUserPermission',
      data: {
        permission: permission,
        targetOpenid: targetOpenid
      }
    })

    if (result.result && result.result.success) {
      return result.result.data.hasPermission
    }

    return false

  } catch (error) {
    console.error('❌ 权限检查失败:', error)
    return false
  }
}

/**
 * 获取用户权限信息
 * @param {string} targetOpenid 目标用户openid（可选）
 * @returns {Promise<Object>} 用户权限信息
 */
export async function getUserPermissions(targetOpenid = null) {
  try {
    const result = await wx.cloud.callFunction({
      name: 'checkUserPermission',
      data: {
        permission: 'basic', // 使用基础权限来获取用户信息
        targetOpenid: targetOpenid
      }
    })

    if (result.result && result.result.success) {
      return {
        success: true,
        data: result.result.data
      }
    }

    return {
      success: false,
      error: result.result?.error || '获取权限信息失败'
    }

  } catch (error) {
    console.error('❌ 获取用户权限失败:', error)
    return {
      success: false,
      error: error.message || '获取权限信息失败'
    }
  }
}

/**
 * 检查是否是管理员（包括超级管理员）
 * @returns {Promise<boolean>} 是否是管理员
 */
export async function isAdmin() {
  // 检查是否有管理员权限或超级管理员权限
  const hasAdmin = await checkPermission(PERMISSIONS.ADMIN)
  const hasSuperAdmin = await checkPermission(PERMISSIONS.SUPER_ADMIN)
  return hasAdmin || hasSuperAdmin
}

/**
 * 检查是否是超级管理员
 * @returns {Promise<boolean>} 是否是超级管理员
 */
export async function isSuperAdmin() {
  return await checkPermission(PERMISSIONS.SUPER_ADMIN)
}

/**
 * 权限装饰器 - 在页面中使用
 * @param {string} permission 需要的权限
 * @param {Function} callback 有权限时执行的回调
 * @param {Function} fallback 无权限时执行的回调（可选）
 */
export async function requirePermission(permission, callback, fallback = null) {
  const hasPermission = await checkPermission(permission)
  
  if (hasPermission) {
    if (typeof callback === 'function') {
      callback()
    }
  } else {
    if (typeof fallback === 'function') {
      fallback()
    } else {
      wx.showModal({
        title: '权限不足',
        content: `您没有"${PERMISSION_NAMES[permission] || permission}"权限，无法执行此操作。`,
        showCancel: false
      })
    }
  }
}

/**
 * 显示权限不足提示
 * @param {string} permission 权限标识
 * @param {string} action 操作描述
 */
export function showPermissionDenied(permission, action = '执行此操作') {
  const permissionName = PERMISSION_NAMES[permission] || permission
  
  wx.showModal({
    title: '权限不足',
    content: `您没有"${permissionName}"权限，无法${action}。\n\n请联系管理员获取相应权限。`,
    showCancel: false,
    confirmText: '我知道了'
  })
}

/**
 * 权限检查中间件 - 在页面onLoad中使用
 * @param {string} permission 需要的权限
 * @param {Object} pageInstance 页面实例
 * @returns {Promise<boolean>} 是否有权限
 */
export async function checkPagePermission(permission, pageInstance) {
  try {
    const hasPermission = await checkPermission(permission)
    
    if (pageInstance && pageInstance.setData) {
      pageInstance.setData({
        hasPermission: hasPermission,
        loading: false
      })
    }
    
    if (!hasPermission) {
      console.warn(`⚠️ 用户无权限访问页面，需要权限: ${permission}`)
    }
    
    return hasPermission
    
  } catch (error) {
    console.error('❌ 页面权限检查失败:', error)
    
    if (pageInstance && pageInstance.setData) {
      pageInstance.setData({
        hasPermission: false,
        loading: false
      })
    }
    
    return false
  }
}

/**
 * 获取权限名称
 * @param {string} permission 权限标识
 * @returns {string} 权限名称
 */
export function getPermissionName(permission) {
  return PERMISSION_NAMES[permission] || permission
}

/**
 * 获取角色名称
 * @param {string} role 角色标识
 * @returns {string} 角色名称
 */
export function getRoleName(role) {
  return ROLE_NAMES[role] || role
}

/**
 * 获取所有权限列表
 * @returns {Array} 权限列表
 */
export function getAllPermissions() {
  return Object.keys(PERMISSIONS).map(key => ({
    key: PERMISSIONS[key],
    name: PERMISSION_NAMES[PERMISSIONS[key]]
  }))
}

/**
 * 获取所有角色列表
 * @returns {Array} 角色列表
 */
export function getAllRoles() {
  return Object.keys(ROLES).map(key => ({
    key: ROLES[key],
    name: ROLE_NAMES[ROLES[key]]
  }))
}
